#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//myfile helloworld
//int main(int argc, char* argv[])
int main()
{
    //C语言提供的
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    const char* s = "hello puts\n";
    fputs(s, stdout);
    
    //OS提供的
    const char* ss = "hello write\n";
    write(1, ss, strlen(ss));

    //fork之前强制刷新
    fflush(stdout);

    //注意：是最后调用的fork，上面的函数已经被执行完了
    fork(); //创建子进程

  //  if(argc != 2)
  //  {
  //      return 2;
  //  }
  //  int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  //  //int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND);
  //  if(fd < 0)
  //  {
  //      perror("open");
  //      return 1;
  //  }
  //  dup2(fd, 1);
  //  fprintf(stdout, "%s\n", argv[1]); //stdout->1->显示器

  //  close(fd);


  //  close(1);
  //  //int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT);
  //  int fd = open("log.txt", O_WRONLY | O_APPEND | O_CREAT);
  //  if(fd < 0)
  //  {
  //      perror("open");
  //      return 1;
  //  }
  //  fprintf(stdout, "you can see me, success\n");

   // printf("fd: %d\n", fd);

   // char buffer[64];
   // fgets(buffer, sizeof buffer, stdin);

   // printf("%s", buffer);

  //  close(1);
  //  // 这里的fd的分配规则是：最小且没有被占用的文件描述符
  //  // 0、1、2 -> close(1) -> fd -> 1
  //  int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  //  if(fd < 0)
  //  {
  //      perror("open");
  //      return 1;
  //  }

  //  //都应该是往显示器上(标准输出)打印的
  //  //但下面的都写入(显示)到了log.txt
  //  //这是为什么呢？输出重定向
  //  printf("fd: %d\n", fd); //printf默认是往stdout打 -> FILE{fileno=1}->log.txt
  //  fprintf(stdout, "hello fprintf\n");
  //  const char* s = "hello fwrite\n";
  //  fwrite(s, strlen(s), 1, stdout);

  //  //////////////////////////////////////////////////////////
  //  fflush(stdout);
  //  //stdoudt->_fileno == 1;
  //  close(fd);
    return 0;
}

//int main()
//{
    //stdin, stdout, stderr -> FILE* -> 内部绝对有fd
    //printf("stdin: %d\n", stdin->_fileno);
    //printf("stdout: %d\n", stdout->_fileno);
    //printf("stderr: %d\n", stderr->_fileno);
  //  char input[16];
  //  size_t s = read(0, input, sizeof(input));
  //  if(s > 0)
  //  {
  //      input[s] = '\0';
  //      printf("%s", input);
  //  }

    //int a = 10;
    
    //scanf
    //fscanf(stdin, "%d", &a);

    //printf("%d\n", a);

 //   fprintf(stdout, "hello stdout\n");
 //   const char* s = "hello 1\n";
 //   write(1, s, strlen(s));

  //  umask(0);
  //  //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); //rw-rw-rw-
  //  //int fd = open("log.txt", O_RDONLY); //默认已经存在
  //  //int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666); //rw-rw-rw-
  //  int fd1 = open("log1.txt", O_RDONLY | O_CREAT | O_APPEND); //rw-rw-rw-
  //  printf("open success, fd: %d\n", fd1);
  //  int fd2 = open("log2.txt", O_RDONLY | O_CREAT | O_APPEND); //rw-rw-rw-
  //  printf("open success, fd: %d\n", fd2);
  //  int fd3 = open("log3.txt", O_RDONLY | O_CREAT | O_APPEND); //rw-rw-rw-
  //  printf("open success, fd: %d\n", fd3);
  //  int fd4 = open("log4.txt", O_RDONLY | O_CREAT | O_APPEND); //rw-rw-rw-
  //  printf("open success, fd: %d\n", fd4);
   //if(fd < 0)
   // {
   //     perror("open");
   //     return 1;
   // }
  //  char buffer[64];
  //  memset(buffer, '\0', sizeof(buffer));
  //  read(fd, buffer, sizeof(buffer));

  //  printf("%s", buffer);

    //const char* s = "hello write\n";
    //const char* s = "aa\n";
    //write(fd, s, strlen(s)); //不需要+1
    //open success

  //  close(fd1);
  //  close(fd2);
  //  close(fd3);
  //  close(fd4);
  //  return 0;
//}



//用int中不重复的一个bit，就可以表示一种状态
//#define ONE 0x1   //0000 0001
//#define TWO 0x2   //0000 0010
//#define THREE 0x4 //0000 0100
//
//void show(int flags) //0000 0101
//{
//    if(flags & ONE) printf("hello one\n"); //0000 0011 & 0000 0001
//    if(flags & TWO) printf("hello two\n");
//    if(flags & THREE) printf("hello three\n");
//}
//
//int main()
//{
//    show(ONE);
//    printf("----------------------------------------------\n");
//    show(TWO);
//    printf("----------------------------------------------\n");
//    show(ONE | TWO); //0000 0001 | 0000 0010 === 0000 0011
//    printf("----------------------------------------------\n");
//    show(ONE | TWO | THREE);
//    printf("----------------------------------------------\n");
//    show(ONE | THREE);
//    printf("----------------------------------------------\n");
//    return 0;
//}

//myfile 一个文件名
//int main(int argc, char* argv[])
//{
//    if(argc != 2)
//    {
//        printf("argv error!|n");
//        return 1;
//    }
//    FILE* fp = fopen(argv[1], "r");
//    if(fp == NULL)
//    {
//        //strerror
//        perror("fopen");
//        return 2;
//    }
//
//    //按行读取
//    char line[64];
//    while(fgets(line, sizeof(line), fp) != NULL)
//    {
//        //printf("%s", line);
//        fprintf(stdout, "%s", line);
//    }
//
//    //进行文件操作
//    //const char* s1 = "hello fwrite\n";
//    //fwrite(s1, strlen(s1), 1, fp); //不需要+1，\0结尾是C语言的规定，文件不用遵守
//
//    //const char* s2 = "hello fprintf\n";
//    //fprintf(fp, "%s", s2);
//
//    //const char* s3 = "hello fputs\n";
//    //fputs(s3, fp);
//
//    fclose(fp);
//
// //   while(1)
// //   {
// //       sleep(1);
// //   }
//    return 0;
//}
